# coding=utf-8
from flask import current_app
from flask import request, jsonify, session
from iHome import redis_store, db
from iHome.models import User
from iHome.response_code import RET
from . import api
import re
from iHome.models import User


@api.route('/session')
# 获取登录用户的信息
def check_user_login():
    username = session.get('username')
    user_id = session.get('user_id')
    return jsonify(errno=RET.OK, errmsg='ok', data={'user_id': user_id, 'username': username})


# 退出登录的逻辑
@api.route('/session', methods=['DELETE'])
def login_out():
    session.clear()
    return jsonify(errno=RET.OK, errmsg='退出成功')


@api.route('/session', methods=['POST'])
def login():
    """
       用户登录功能:
       1. 获取参数（手机号，密码）并参数校验
       2. 根据手机号查询用户的信息（如果查询不到，用户不存在）
       3. 校验用户的密码是否正确，如果正确
       4. 在session中记录用户的登录状态
       5. 返回应答，登录成功
       """
    # 1.获取参数（手机号，密码）并参数校验
    req_dict = request.json
    mobile = req_dict.get('mobile')
    password = req_dict.get('password')
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='缺少参数')
    if not re.match(r'^1[3456789]\d{9}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机格式不正确')

    # 根据手机号查询用户的信息（如果查询不到，用户不存在）
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询信息失败')
    if not user:
        return jsonify(errno=RET.USERERR, errmsg='用户不存在')
    # 校验用户的密码是否正确，如果正确
    if not user.check_user_password(password):
        return jsonify(errno=RET.PWDERR, errmsg='密码输入错误')
    # 保存用户
    session['user_id'] = user.id
    session['mobile'] = user.mobile
    session['username'] = user.name

    return jsonify(errno=RET.OK, errmsg='登录成功')


@api.route('/users', methods=['post'])
def register():
    # 获取参数
    req_dict = request.json
    mobile = req_dict.get('mobile')
    phonecode = req_dict.get('phonecode')
    password = req_dict.get('password')
    # 验证数据的有效性
    if not all([mobile, phonecode, password]):
        return jsonify(errno=RET.DATAERR, errmsg='数据不完整')
    try:
        sms_code = redis_store.get('sms_code:%s' % mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='短信验证码不存在')
    if not sms_code:
        return jsonify(errno=RET.NODATA, errmsg='验证码已经过期')
    if sms_code != phonecode:
        return jsonify(errno=RET.DATAERR, errmsg='请输入正确的短信验证码')
    # 校验手机是否注册
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as e:
        user = None
        current_app.logger.error(e)
    if user:
        return jsonify(errno=RET.DATAEXIST, errmsg='手机号已经注册')
    # 创建user并保存用户
    user = User()
    user.mobile = mobile
    user.name = mobile
    # TODO 密码加密
    user.password = password
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='保存失败')
    # 注册成功，返回应答
    return jsonify(errno=RET.OK, errmsg='注册成功')
